{"version":3,"file":"static/chunks/pages/offers/[...slug]-a7501ee77d4128de.js","mappings":"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","sources":["webpack://_N_E/?576f","webpack://_N_E/./components/view-details.tsx","webpack://_N_E/./pages/offers/[...slug].tsx","webpack://_N_E/./utils/remove-qs.ts","webpack://_N_E/./utils/slugify-offer.ts"],"sourcesContent":["\n    (window.__NEXT_P = window.__NEXT_P || []).push([\n      \"/offers/[...slug]\",\n      function () {\n        return require(\"private-next-pages/offers/[...slug].tsx\");\n      }\n    ]);\n    if(module.hot) {\n      module.hot.dispose(function () {\n        window.__NEXT_P.push([\"/offers/[...slug]\"])\n      });\n    }\n  ","import { slugifyOfferName } from '../utils/slugify-offer';\nimport { BrandLink } from '@dx-ui/osc-brand-buttons';\nimport { useTranslation } from 'next-i18next';\nimport { addCampaignId, type OfferListingFragment } from '@dx-ui/content-offers-components';\n\ntype Offer = OfferListingFragment['offers'][0];\n\nexport function ViewDetailsLink({\n  offer,\n  hrefPrefix,\n  onClick,\n}: {\n  offer: Offer;\n  hrefPrefix: string;\n  onClick?: (offer: Offer) => void;\n}) {\n  const { t } = useTranslation('offers');\n  return (\n    <BrandLink\n      url={addCampaignId(`${hrefPrefix}${slugifyOfferName(offer)}`)}\n      onClick={() => onClick?.(offer)}\n      className=\"w-full text-center md:w-auto\"\n      data-offer-slug={slugifyOfferName(offer)}\n      data-offer-name={offer.name}\n      aria-label={t('viewDetailsA11y', {\n        offerName: offer?.name || '',\n      })}\n      target=\"_blank\"\n      showNewWindowIcon={false}\n      variant=\"solid\"\n      label={t('viewDetails')}\n    />\n  );\n}\n","import {\n  DX_AUTH_UI,\n  OHW_BASE_URL_TRIMMED,\n  queryClientProps,\n  ASSETS_URI,\n  AUTOCOMPLETE_URL,\n} from '../../utils/env-vars';\nimport { getServerSideClients, getServerSideSafeLanguage } from '@dx-ui/framework-react-query';\nimport type {\n  StaticOfferQuery,\n  BrandOfferListingQuery as BrandStaticOfferOptionsQuery,\n} from '@dx-ui/content-offers-components';\nimport {\n  OfferDetails,\n  OfferListing,\n  serverSideBrandOfferListingQuery,\n  serverSideStaticOfferQuery,\n} from '@dx-ui/content-offers-components';\n\nimport Head from 'next/head';\nimport { getOfferIdFromSlug, slugifyOfferName } from '../../utils/slugify-offer';\nimport { OffersHeader } from '../../components/header';\nimport { OffersFooter } from '../../components/footer';\nimport { useRouter } from 'next/router';\nimport { ViewDetailsLink } from '../../components/view-details';\nimport type { PageMetricsDetail, PageMetricsListing } from '../../components/analytics';\nimport { Analytics } from '../../components/analytics';\nimport { getBrandCanonical } from '../../utils/get-brand-canonical';\nimport { removeQs } from '../../utils/remove-qs';\nimport { serverSideNavigationQuery } from '../../generated/react-query';\nimport type { GetServerSideProps } from 'next';\nimport { getServerSideShopFormData } from '@dx-ui/osc-shop-form';\n\nimport { serverSideProps } from '../../utils/serverSideProps';\nimport { logWarning } from '@dx-ui/framework-logger';\n\nexport default function OfferSlugPage(props: {\n  brandCode?: string;\n  brandName?: string;\n  brandUrl?: string;\n  isBrandPage?: boolean;\n  isBrandRefresh?: boolean;\n  offerId?: number;\n  seo?:\n    | NonNullable<NonNullable<BrandStaticOfferOptionsQuery['brand']>['page']>['seo']\n    | NonNullable<NonNullable<StaticOfferQuery['staticOffer']>['seo']>;\n  metrics: PageMetricsListing | PageMetricsDetail;\n  brandSlug?: string;\n}) {\n  const { locale = 'en', query, asPath } = useRouter();\n  const brandCode = props.brandCode || 'HI';\n  const { seo, brandUrl, brandName, metrics } = props;\n  const themeClassName = brandCode\n    ? `theme-${brandCode.toLowerCase()}${props.isBrandRefresh ? '-refresh' : ''}`\n    : undefined;\n\n  return (\n    <div className={themeClassName}>\n      <Analytics metrics={metrics} />\n      <Head>\n        <title>{seo?.pageTitle}</title>\n        <meta name=\"keywords\" content={seo?.metaKeywords || ''} />\n        <meta name=\"description\" content={seo?.metaDescription || ''} />\n        {seo?.hideSearchEngine ? <meta name=\"robots\" content=\"noindex,follow\" /> : null}\n      </Head>\n      <OffersHeader\n        brandCode={brandCode}\n        brandUrl={brandUrl}\n        brandName={brandName}\n        language={locale}\n      />\n      {props.offerId && (\n        <OfferDetails\n          offerId={props.offerId}\n          language={locale}\n          brandCode={brandCode}\n          autocompleteUri={AUTOCOMPLETE_URL}\n          baseUrl={OHW_BASE_URL_TRIMMED}\n          signInIframeUrl={DX_AUTH_UI.replace('__LANG__', locale)}\n          renderAdditionalComponents={(data) => {\n            const path =\n              data?.staticOffer?.type === 'brand'\n                ? `/${locale}/offers/${slugifyOfferName(data?.staticOffer)}/`\n                : asPath;\n            const canonicalUrl = removeQs(path);\n\n            return (\n              <Head>\n                <link rel=\"canonical\" href={canonicalUrl} />\n                <meta name=\"twitter:card\" content=\"summary\" />\n                <meta name=\"twitter:site\" content=\"@Hilton\" />\n                <meta property=\"og:url\" content={canonicalUrl} />\n                <meta property=\"og:type\" content=\"website\" />\n                <meta property=\"og:title\" content={seo?.pageTitle || ''} />\n                <meta property=\"og:description\" content={seo?.metaDescription || ''} />\n                <meta property=\"og:site_name\" content=\"Hilton\" />\n                <meta property=\"og:image\" content={data.firstImageForOg} />\n              </Head>\n            );\n          }}\n        />\n      )}\n      {props.isBrandPage && (\n        <div className=\"container mx-auto my-4\">\n          <Head>\n            <link rel=\"canonical\" href={removeQs(`/${locale}${asPath}`)} />\n          </Head>\n          <OfferListing\n            language={locale}\n            brandCode={brandCode}\n            assetUrl={ASSETS_URI}\n            renderAdditionalComponents={(data) => {\n              return (\n                <Head>\n                  <meta name=\"twitter:card\" content=\"summary\" />\n                  <meta name=\"twitter:site\" content=\"@Hilton\" />\n                  <meta property=\"og:url\" content={removeQs(`/${locale}${asPath}`)} />\n                  <meta property=\"og:type\" content=\"website\" />\n                  <meta property=\"og:title\" content={seo?.pageTitle || ''} />\n                  <meta property=\"og:description\" content={seo?.metaDescription || ''} />\n                  <meta property=\"og:site_name\" content=\"Hilton\" />\n                  <meta property=\"og:image\" content={data.firstImageForOg} />\n                </Head>\n              );\n            }}\n            renderInternalOfferLink={(offer) => (\n              <ViewDetailsLink\n                offer={offer}\n                hrefPrefix={`/${locale}/offers/${(query.slug as string[])?.join('/')}/`}\n              />\n            )}\n          />\n        </div>\n      )}\n      <OffersFooter brandCode={brandCode} language={locale} />\n    </div>\n  );\n}\n\nexport const getServerSideProps = async function getServerSideProps(context) {\n  const { query, res, req } = context;\n  const [possibleBrandName, possibleOfferId] = query.slug as [string, string];\n  const featureToggleHeader = req.headers['dx-toggles'] as string;\n  const locale = getServerSideSafeLanguage(context);\n\n  const { queryClient } = getServerSideClients({\n    ...queryClientProps,\n    response: res,\n    appName: 'dx-offers-ui',\n    customHeaders: {\n      'dx-toggles': featureToggleHeader,\n    },\n  });\n  const brandMatches = await getBrandCanonical({\n    queryClient,\n    requestedBrandName: possibleBrandName,\n    language: locale,\n  });\n\n  if (brandMatches?.redirectBrandSlug) {\n    const offerId = possibleOfferId;\n    return {\n      redirect: {\n        destination: `/${locale}/offers/${brandMatches.redirectBrandSlug}/${\n          offerId ? `${offerId}/` : ''\n        }`,\n        permanent: true,\n      },\n    };\n  }\n\n  if (brandMatches && !possibleOfferId) {\n    // this is a brand listing page, not an offer detail page\n    const brandOfferListingResult = await serverSideBrandOfferListingQuery(queryClient, {\n      brandCode: brandMatches.brandCode,\n      language: locale,\n    }).catch((error) => {\n      logWarning('FETCH_ERROR', error as Error, 'serverSideBrandOfferListingQuery');\n      return null;\n    });\n    const brandCode = brandMatches.brandCode;\n    const seo = brandOfferListingResult?.brand?.page?.seo || {};\n    const metrics: PageMetricsListing = {\n      brandCode: brandMatches.brandCode,\n      brandName: brandOfferListingResult?.brand?.formalName || '',\n      language: locale,\n      primaryCategory: 'Brand',\n      trackCallName: 'offerListingPageView',\n    };\n\n    if (locale !== 'en') {\n      return {\n        notFound: true,\n      };\n    }\n\n    return serverSideProps({\n      context,\n      namespaces: ['osc-pagination'],\n      queryClient,\n      pageProps: {\n        seo,\n        metrics,\n        isBrandPage: true,\n        brandCode,\n        brandUrl: brandMatches?.url || null,\n        brandName: brandMatches?.formalName || null,\n      },\n      getServerSideQueries: ({ queryClient, language }) => [\n        getServerSideShopFormData(queryClient, { getTranslateAutocomplete: true }).catch((e) => {\n          logWarning('FETCH_ERROR', e as Error, 'serverSideShopFormData');\n        }),\n        serverSideNavigationQuery(queryClient, {\n          language,\n          brandCode: brandMatches?.brandCode || 'WW',\n        }).catch((e) => {\n          logWarning('FETCH_ERROR', e as Error, 'serverSideNavigationQuery');\n        }),\n      ],\n    });\n  }\n\n  // brandName might be the offerId\n  const unSlugifiedOfferId = possibleOfferId\n    ? getOfferIdFromSlug(possibleOfferId || '')\n    : getOfferIdFromSlug(possibleBrandName);\n\n  // try to fetch that offer\n  let offerResult: StaticOfferQuery | null = null;\n  const offerId = isNaN(Number(unSlugifiedOfferId)) ? null : Number(unSlugifiedOfferId);\n  if (offerId) {\n    offerResult = await serverSideStaticOfferQuery(queryClient, {\n      language: locale,\n      offerId,\n      includeHotel: false,\n      ctyhocn: '',\n      brandCode: brandMatches?.brandCode || 'WW',\n    }).catch(() => null);\n  }\n\n  const brandOfferDetailPage = Boolean(possibleOfferId && possibleBrandName);\n\n  // if that offer is not found redirect back to offers page or brand offers\n  if (!offerResult?.staticOffer) {\n    const urlParts = [locale, 'offers'];\n    if (brandOfferDetailPage) {\n      urlParts.push(brandMatches?.redirectBrandSlug || possibleBrandName);\n    }\n    return {\n      redirect: {\n        destination: `/${urlParts.join('/')}/`,\n        permanent: true,\n      },\n    };\n  }\n\n  // make sure offer name slugified matches what was passed, if not redirect to correct name\n  if (\n    slugifyOfferName(offerResult.staticOffer) !==\n    (brandOfferDetailPage ? possibleOfferId : possibleBrandName)\n  ) {\n    const urlParts = [locale, 'offers'];\n    if (brandOfferDetailPage) {\n      urlParts.push(brandMatches?.redirectBrandSlug || possibleBrandName);\n    }\n    urlParts.push(slugifyOfferName(offerResult.staticOffer));\n    return {\n      redirect: {\n        destination: `/${urlParts.join('/')}/`,\n        permanent: true,\n      },\n    };\n  }\n\n  const seo = offerResult?.staticOffer?.seo || {};\n  const metrics: PageMetricsDetail = {\n    brandCode: 'HI',\n    brandName: offerResult?.brand?.formalName || '',\n    language: locale,\n    primaryCategory: 'Portfolio',\n    trackCallName: 'offerDetailPageView',\n    offerId: unSlugifiedOfferId,\n    offerName: offerResult?.staticOffer?.name,\n  };\n\n  const brandCode = brandMatches?.brandCode || 'WW';\n\n  if (brandCode !== 'WW' && locale !== 'en') {\n    return {\n      notFound: true,\n    };\n  }\n\n  // otherwise offer found, this is a single offer page\n  return serverSideProps({\n    context,\n    namespaces: [\n      'osc-accordion',\n      'osc-date-picker',\n      'osc-form',\n      'osc-location',\n      'osc-pagination',\n      'osc-shop-form',\n    ],\n    queryClient,\n    pageProps: {\n      seo,\n      metrics,\n      offerId,\n      brandCode,\n      brandUrl: brandMatches?.url || null,\n      brandName: brandMatches?.formalName || null,\n    },\n  });\n} satisfies GetServerSideProps;\n","import { OHW_BASE_URL_TRIMMED } from './env-vars';\n\nexport function removeQs(asPath: string) {\n  const url = new URL(`${OHW_BASE_URL_TRIMMED}${asPath}`);\n  return `${url.protocol}//${url.host}${url.pathname}`;\n}\n","export { slugifyOfferName } from '@dx-ui/content-offers-components';\n\nexport function getOfferIdFromSlug(slug: string): string {\n  const parts = slug.split('-');\n  return parts[parts.length - 1] || '';\n}\n"],"names":["ViewDetailsLink","offer","hrefPrefix","onClick","useTranslation","t","BrandLink","url","addCampaignId","slugifyOfferName","className","data-offer-slug","data-offer-name","name","aria-label","offerName","target","showNewWindowIcon","variant","label","OfferSlugPage","props","useRouter","locale","query","asPath","brandCode","seo","brandUrl","brandName","metrics","themeClassName","toLowerCase","isBrandRefresh","undefined","div","Analytics","Head","title","pageTitle","meta","content","metaKeywords","metaDescription","hideSearchEngine","OffersHeader","language","offerId","OfferDetails","autocompleteUri","AUTOCOMPLETE_URL","baseUrl","OHW_BASE_URL_TRIMMED","signInIframeUrl","DX_AUTH_UI","replace","renderAdditionalComponents","data","path","staticOffer","type","canonicalUrl","removeQs","link","rel","href","property","firstImageForOg","isBrandPage","OfferListing","assetUrl","ASSETS_URI","renderInternalOfferLink","slug","join","OffersFooter","URL","protocol","host","pathname"],"sourceRoot":"","ignoreList":[]}